package com.coolw.dynamic.thread.pool.domain.dto;

import com.coolw.common.api.BaseDomain;
import com.coolw.dynamic.thread.pool.enums.KeepAliveTimeUnitEnum;
import com.coolw.dynamic.thread.pool.enums.QueueTypeEnum;
import com.coolw.dynamic.thread.pool.enums.RejectedExecutionHandlerEnum;
import com.coolw.dynamic.thread.pool.enums.StatStatusEnum;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import java.util.List;

/**
 * 线程池监控统计结果
 *
 * @author coolw
 * @date 2024/5/16 11:39
 */
@Getter
@Setter
@NoArgsConstructor
public class ThreadPoolStatDTO extends BaseDomain {
    private static final long serialVersionUID = 4047508402668159507L;

    /**
     * 统计开始时间;yyyy-MM-dd HH:mm:ss
     */
    private String startTime;

    /**
     * 统计结束时间;yyyy-MM-dd HH:mm:ss
     */
    private String endTime;

    /**
     * 统计信息描述
     */
    private String message;

    /**
     * 当前统计成功次数
     */
    private Long successCount;

    /**
     * 线程池统计信息
     */
    private List<StatInfo> statInfoList;

    public ThreadPoolStatDTO(String message) {
        this.message = message;
    }

    @Getter
    @Setter
    public static class StatInfo extends BaseDomain {
        private static final long serialVersionUID = -2382018190730456401L;

        /**
         * 线程池编号
         */
        private String poolNo;

        /**
         * 线程池代码
         */
        private String poolCode;

        /**
         * 线程池名称
         */
        private String poolName;

        /**
         * 核心线程数
         */
        private Integer corePoolSize;

        /**
         * 最大线程数
         */
        private Integer maxPoolSize;

        /**
         * 线程存活时间
         */
        private Long keepAliveTime;

        /**
         * 线程存活时间单位 {@link KeepAliveTimeUnitEnum}
         */
        private String keepAliveTimeUnit;

        /**
         * 队列类型 {@link QueueTypeEnum}
         */
        private String queueType;

        /**
         * 队列大小
         */
        private Integer queueSize;

        /**
         * 当前队列使用大小
         */
        private Integer useQueueSize;

        /**
         * 当前队列使用占比(%)
         */
        private String useQueueRate;

        /**
         * 拒绝策略 {@link RejectedExecutionHandlerEnum}
         */
        private String rejectStrategy;

        /**
         * 线程池中活动线程数量
         */
        private Integer activeCount;

        /**
         * 已执行完成的任务量
         */
        private Long completedTaskCount;

        /**
         * 执行的任务量(包括正在执行的任务)
         */
        private Long taskCount;

        /**
         * 线程池中曾有过的最大线程量
         */
        private Integer largestPoolSize;

        /**
         * 统计状态;SUCCESS-成功,FAIL-失败。{@link StatStatusEnum}
         */
        private String statStatus;
    }
}
